package com.hry.myapp.utils;

import java.lang.reflect.Modifier;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import com.alibaba.druid.sql.ast.SQLStructDataType.Field;
import com.baomidou.mybatisplus.core.toolkit.BeanUtils;


public class CommonUtils {
	
	@SuppressWarnings("deprecation")
	public static <T> T mapToObject(Map<String, Object> map, Class<T> clazz) {
        
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS+00:00");
        
		Set<String> set = map.keySet();

         
        if (map == null) {
            return null;
        }
        T obj = null;
        try {
       	
            // 使用newInstance来创建对象
            obj = clazz.newInstance();
            // 获取类中的所有字段
            java.lang.reflect.Field[] fields = obj.getClass().getDeclaredFields();
            for (java.lang.reflect.Field field : fields) {
                int mod = field.getModifiers();
                // 判断是拥有某个修饰符
                if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
                    continue;
                }
                // 当字段使用private修饰时，需要加上
                field.setAccessible(true);
                // 获取参数类型名字
                String filedTypeName = field.getType().getName();
                // 判断是否为时间类型，使用equalsIgnoreCase比较字符串，不区分大小写
                // 给obj的属性赋值
                
                

            	if(set.contains(field.getName())){
            		
            		
//            		if(filedTypeName.equals("int")) {
//            			
//            			int value = Integer.parseInt(map.get(field.getName()).toString()) ;
//            			field.set(obj, value);
//            			
//            		}else {
//            			
//            			field.set(obj, map.get(field.getName()));
//
//            		}
            		
            		
            		if(filedTypeName.equals("int")) {
        			
	        			int value = Integer.parseInt(map.get(field.getName()).toString()) ;
	        			field.set(obj, value);
        			
        			}else if(filedTypeName.equals("float")) {
            			
            			float value = Float.parseFloat(map.get(field.getName()).toString()) ;
            			field.set(obj, value);
            			
            		}else if(filedTypeName.equalsIgnoreCase("java.util.date")){
        			
	                    String datetimestamp = map.get(field.getName()).toString();
	                    if (datetimestamp.equalsIgnoreCase("null")) {
                    	
                        field.set(obj, null);
                        
                    } else {
                    	
            			Long value = Long.parseLong(map.get(field.getName()).toString()) ;
            			Date d = new Date(value) ;
            			field.set(obj, d);
                      
                    }
                    
        		}else {
    			
        			field.set(obj, map.get(field.getName()));

        		}

            		
            		

//            			
            		}

            	}
                    
                    
                
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }
	
	
	@SuppressWarnings("deprecation")
	public static Map ObjectToMap(Object obj) {
        

        Map<String,Object> propertiesMap=new HashMap<>();
        
        java.lang.reflect.Field[] fields = obj.getClass().getDeclaredFields();
        for(int i = 0 , len = fields.length; i < len; i++) {
            // 对于每个属性，获取属性名
            String varName = fields[i].getName();
            try {
                // 获取原来的访问控制权限
                boolean accessFlag = fields[i].isAccessible();
                // 修改访问控制权限
                fields[i].setAccessible(true);
                // 获取在对象f中属性fields[i]对应的对象中的变量
                Object o;
                try {
                    o = fields[i].get(obj);
                    propertiesMap.put(varName,o);
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                // 恢复访问控制权限
                fields[i].setAccessible(accessFlag);
            } catch (IllegalArgumentException ex) {
                ex.printStackTrace();
            }
        }
        
        return propertiesMap;
        
        
    }
	
	

}
